package com.yuzhenxin.bookstore.service;

import com.example.framework.common.exception.ServiceException;
import com.yuzhenxin.bookstore.config.BookstoreErrorCodeConstants;
import com.yuzhenxin.bookstore.dao.UserDao;
import com.yuzhenxin.bookstore.domain.User;

/**
 * User业务层
 *
 * @author LENOVO
 *
 */
public class UserService {

    private final UserDao userDao = new UserDao();

    /**
     * 注册功能
     */
    public void regist(User form) {

        // 校验用户名
        User user = userDao.findByUsername(form.getUsername());
        if (user != null) {
            throw ServiceException.of(BookstoreErrorCodeConstants.USER_EXISTS);
        }

        // 校验邮箱
        user = userDao.findByEmail(form.getEmail());
        if (user != null) {
            throw ServiceException.of(BookstoreErrorCodeConstants.EMAIL_EXISTS);
        }

        // 插入用户到数据库
        userDao.add(form);
    }

    /**
     * 激活功能
     */
    public void active(String code) {
        /*
         * 1、使用code查询数据库，得到user
         */
        User user = userDao.findByCode(code);
        /*
         * 如果user不存在，说明激活码错误
         */
        if (user == null) {
            throw ServiceException.of(BookstoreErrorCodeConstants.ACTIVE_CODE_ERROR);
        }
        /*
         * 校验用户状态是否为未激活状态，若已激活，抛异常
         */
        if (user.isState()) {
            throw ServiceException.of(BookstoreErrorCodeConstants.USER_ACTIVATED);
        }
        /*
         * 修改用户状态
         */
        userDao.updateSatate(user.getUid(), true);
    }

    /**
     * 登录功能
     */
    public User login(User form) {
        /*
         * 1、使用username查询，得到user
         * >若user为null，抛出异常
         * 2、比较form和user的密码
         * >不同，抛异常
         * 3、查看用户和状态
         * >若为false，抛出异常
         * 4、返回user
         */
        User user = userDao.findByUsername(form.getUsername());
        if (user == null) {
            throw ServiceException.of(BookstoreErrorCodeConstants.USER_NOT_FOUND);
        }
        if (!user.getPassword().equals(form.getPassword())) {
            throw ServiceException.of(BookstoreErrorCodeConstants.LOGIN_ERROR);
        }
        if (!user.isState()) {
            throw ServiceException.of(BookstoreErrorCodeConstants.USER_STATE_ERROR);
        }
        /*
         * 返回完整用户信息
         */
        return user;
    }

    public void change(String username, String password) {
        userDao.change(username, password);
    }
}
